import sqlite3
from faker import Faker

# 初始化 Faker 实例
fake = Faker('zh_CN')  # 使用中文数据生成器

# 连接到 SQLite 数据库
conn = sqlite3.connect('student.db')
cursor = conn.cursor()

# 启用外键支持
conn.execute('PRAGMA foreign_keys = ON;')

# 创建班级表 (classrooms)
cursor.execute('''
CREATE TABLE IF NOT EXISTS classrooms (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 班级唯一标识符
    name TEXT NOT NULL                     -- 班级名称
);
''')

# 创建学生表 (students)，包含外键引用班级表
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (
    id INTEGER PRIMARY KEY AUTOINCREMENT,   -- 学生唯一标识符
    student_name TEXT NOT NULL,             -- 学生姓名
    student_number TEXT NOT NULL,           -- 学生学号
    class_id INTEGER NOT NULL,              -- 班级ID（外键）
    chinese_score INTEGER NOT NULL,         -- 语文成绩
    math_score INTEGER NOT NULL,            -- 数学成绩
    physics_score INTEGER NOT NULL,         -- 物理成绩
    biology_score INTEGER NOT NULL,         -- 生物成绩
    FOREIGN KEY (class_id) REFERENCES classrooms(id)
);
''')

# 插入一些随机班级数据
for _ in range(30):  # 创建30个班级
    class_name = f"{fake.word()}班"
    cursor.execute("INSERT INTO classrooms (name) VALUES (?)", (class_name,))

# 获取所有班级ID用于关联学生表
cursor.execute("SELECT id FROM classrooms")
class_ids = [row[0] for row in cursor.fetchall()]

# 插入 5000 条随机学生数据
for _ in range(5000):
    student_data = (
        fake.name(),                        # 学生姓名
        fake.pystr_format(string_format='????##??'),  # 学生学号 (格式：XXXX##XX)
        fake.random_element(elements=class_ids),      # 班级ID
        fake.random_int(min=0, max=100),              # 语文成绩
        fake.random_int(min=0, max=100),              # 数学成绩
        fake.random_int(min=0, max=100),              # 物理成绩
        fake.random_int(min=0, max=100),              # 生物成绩
    )
    cursor.execute('''
    INSERT INTO students (student_name, student_number, class_id, chinese_score, math_score, physics_score, biology_score)
    VALUES (?, ?, ?, ?, ?, ?, ?)
    ''', student_data)

# 提交更改并关闭连接
conn.commit()
conn.close()

print("数据库 student.db 创建成功，已插入 30 个班级和 5000 条学生数据！")